package com.mall.server.service;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mall.commons.utils.PageUtils;
import com.mall.dubbo.api.PmsProductCategoryApi;
import com.tanhua.model.domain.PmsProductCategory;
import com.tanhua.model.dto.ProductCategoryDto;
import com.tanhua.model.vo.PageVo;
import com.tanhua.model.vo.ProductCategoryVo;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class ProductCategoryService {

    @DubboReference
    private PmsProductCategoryApi pmsProductCategoryApi;

    /**
     * 查询所有一级分类及子分类
     * @return
     */
    public List<ProductCategoryVo> listWithChildren() {

        List<PmsProductCategory> productCategories=pmsProductCategoryApi.findAll();
        List<ProductCategoryVo> productCategoryVos = new ArrayList<>();

        //获取所有一级分类,和子级分类,并且将一级分类转换成PmsProductCategoryVo对象
        List<ProductCategoryVo> One_productCategoryVos = productCategories.stream().map(pmsProductCategory -> {

            ProductCategoryVo productCategoryVo = new ProductCategoryVo();
            BeanUtils.copyProperties(pmsProductCategory, productCategoryVo);
            if (productCategoryVo.getLevel() == 0) {
                //获取父类总和
                return productCategoryVo;
            }
            //获取子类总和
            productCategoryVos.add(productCategoryVo);
            return null;
        }).collect(Collectors.toList());


        Map<Long, List<ProductCategoryVo>> map = new HashMap<>();
        for (ProductCategoryVo productCategoryVo : productCategoryVos) {
            //获得每个productCategoryVo的parentId
            Long  parentId= productCategoryVo.getParentId();

            if (map.get(parentId) == null){
                List<ProductCategoryVo> list = new ArrayList<>();
                list.add(productCategoryVo);
                map.put(parentId,list);
            }else {
                List<ProductCategoryVo> list2 = map.get(parentId);
                list2.add(productCategoryVo);
            }

        }

        List<ProductCategoryVo> digui = digui(One_productCategoryVos, map);
        return digui;
    }

    /**
     *
     * @param One_productCategoryVos  第一级分类
     *
     * @param map key parent_id   value List<ProductCategoryVo>
     * @return
     */
    public List<ProductCategoryVo> digui(List<ProductCategoryVo> One_productCategoryVos,Map<Long, List<ProductCategoryVo>> map){
        //如果map删完了就返回
        if (map.size() ==0){
            return One_productCategoryVos;
        }

        for (ProductCategoryVo one_productCategoryVo : One_productCategoryVos) {
            if (one_productCategoryVo ==null){
                break;
            }
            Long id = one_productCategoryVo.getId();
            if (!CollUtil.isEmpty(map.get(id))){
                one_productCategoryVo.setChildren(map.get(id));
                map.remove(id);
                digui(one_productCategoryVo.getChildren(),map);
            }
        }

        return One_productCategoryVos;
    }

    /**
     * 根据parentId 分页查询商品分类
     * @param parentId
     * @param pageNum
     * @param pageSize
     * @return
     */
    public PageVo findByParentId(Integer parentId, Integer pageNum, Integer pageSize) {
        Page<PmsProductCategory> pmsProductCategoryPage = new Page<>(pageNum,pageSize);
        Page<PmsProductCategory> page = pmsProductCategoryApi.findByParentId(parentId,pmsProductCategoryPage);
        return PageUtils.getPageVo(page);
    }

    /**
     * 修改导航栏显示状态
     * @param ids
     * @param navStatus
     */
    public void updateNavStatus(Integer[] ids, Integer navStatus) {
        pmsProductCategoryApi.updateNavStatus(ids,navStatus);

    }

    /**
     * 修改显示状态
     * @param ids   必须有值
     * @param showStatus 必须有值    0不显示  1显示
     * @return
     */
    public void updateShowStatus(Integer[] ids, Integer showStatus) {
        pmsProductCategoryApi.updateShowStatus(ids,showStatus);
    }

    /**
     * 添加商品分类
     * @param productCategoryDto
     * @return
     *
     * 这个写的不一定对,后面再看
     */
    public void create(ProductCategoryDto productCategoryDto) {

        pmsProductCategoryApi.create(productCategoryDto);
    }

    /**
     * 根据id获取商品分类
     * @param id
     * @return
     */
    public PmsProductCategory getById(Long id) {
        return pmsProductCategoryApi.getById(id);
    }


    /**
     * 修改商品分类
     * @param id
     * @return
     */
    public void updateById(Long id, ProductCategoryDto productCategoryDto) {
        pmsProductCategoryApi.updateById(id,productCategoryDto);
    }

    /**
     * 删除商品分类
     * @param id
     * @return
     */
    public void delete(Long id) {
        pmsProductCategoryApi.delete(id);
    }
}
